无符号数和有符号数

无符号数

寄存器的位数反映无符号数的表示范围。

有符号数

机器数与真值

真值 机器数
带符号的数 符号数字化的数
+0.1011 0.1011
-0.1011 1.1011
+1100 0,1100
-1100 1,1100

原码表示法

  1. 定义

    • 整数

      $[x]_原=\begin{cases}0,\ x\quad\quad2^n>x\geq0\2^n-x\quad\quad0\geq x>-2^n\end{cases}$

      x为真值,n为整数的位数。

      使用逗号(,)将符号位与数值部分隔开。

      如:

      • $x=+1110\quad[x]_原=0,1110$

      • $x=-1110\quad[x]_原=2^4+1110=1,1110$

    • 小数

      $[x]_原=\begin{cases}x\quad\quad1>x\geq0\1-x\quad\quad0\geq x>-1\end{cases}$

      x为真值。

      使用小数点(.)将符号位与数值部分隔开。

      如:

      • $x=+0.1101\quad[x]_原=0.1101$

      • $x=-0.1101\quad[x]_原=1-(-0.1101)=1.1101$

      • $x=+0.1000000\quad[x]_原=0.1000000$

    特别地:

    • 当$x=0$时,

      $[+0.0000]_原=0.0000$

      $[-0.0000]_原=1-(0.0000)=1.0000$

      可见,$[+0]_原\neq[-0]_原$,即原码中的“零”有两种表示形式

    • 当$x=-1$时,

      x不存在原码。(因为按照定义来看,-1和0地补码都为1)

  2. 特点

    简单、直观。

    但是用原码作加法时,会出现如下问题:

要求 数1 数2 实际操作 结果符号
加法
加法 可正可负
加法 可正可负
加法

能否只作加法

找到一个与负数等价的正数来代替这个负数,就可使减→加。(补码)

补码表示法

  1. 补的概念

    • 一个负数加上“模”即得该负数的补数。

    • 一个正数和一个负数互为补数时,它们的绝对值之和即为数。

    计数器(模16),求$1011→0000$?

    • $1011-1011=0000$

    • $1011+0101=(1)0000$(1超过表示范围,舍去)

    可见,-1011可用+0101代替。

    记作:$-1011\equiv+0101\quad(mod\ 2^4)$

    同理:$-011\equiv+101\quad(mod\ 2^3)$

    $-0.1001\equiv+1.01111\quad(mod\ 2)$

  2. 正数的补码即为其本身

    两个互为补数的数,分别加上模,结果仍互为补数:

    例如:$-1011\equiv+0101\quad(mod\ 2^4)$

    • $-1011+10000=+0101$

    • $+0101+10000=+(1)0101$

    所以,$+0101\equiv+0101\quad(mod\ 2^4)$

    可见,+0101既可作+0101的补码,又可做-1011的补码

    为了区分,需要为补码添加其原码的符号位:

    • 0,0101→+0101

    • 1,0101→-1011

    • 如何得到?

      只需增加一位模,即

      $2^{4+1}-1011=100000-1011=1,0101$

      $2^{4+1}+0101=100000+0101=(1)0,0101$

  3. 补码的定义

    • 整数

      $[x]_补=\begin{cases}0,\ x\quad\quad2^n>x\geq0\2^{n+1}+x\quad\quad0>x\geq-2^n\ (mod\ 2^{n+1})\end{cases}$

      x为真值,n为整数的位数。

      如:

      • $x=+1010\quad[x]_补=0,1010$

      • $x=-1011000\quad[x]_补=2^{7+1}+(-1011000)$

    • 小数

      $[x]_补=\begin{cases}x\quad\quad1>x\geq 0\2+x\quad\quad0>x\geq-1\ (mod\ 2)\end{cases}$

      如:

      • $x=+0.1110\quad[x]_补=0.1110$

      • $x=-0.1100000\quad[x]_补=2+(-0.1100000)=10.0000000-0.1100000=1.0100000$

  4. 求补码的快捷方式

    设$x=-1010$,

    则$[x]_补=2^{4+1}-1010=100000-1010=1,0110$

    $=11111+1-1010=10101+1=1,0110$

    又$[x]_原=1,1010$

    当真值为时,补码可用原码除符号位外每位取反,末位加1求得

  5. 举例

    • 已知$[x]_补=0.0001$,求x

      解:由定义得 $x=+0.0001$

    • 已知$[x]_补=1.0001$,求x

      解:方法(1):由定义得 $x=[x]_补-2=1.0001-10.0000=-0.1111$

      方法(2):$[x]_原=1.1111,则x=-0.1111$

    • 已知$[x]_补=1,1110,求x$

      解:方法(1):由定义得 $x=[x]_补-2^{4+1}=1,1110-100000=-0010$

      方法(2):$[x]_原=1,0010,则x=-0010$

    当真值为时,原码可用补码除符号位外每位取反,末位加1求得

    特别地:

    • 当$x=0$时,

      $[+0.0000]_补=[-0.0000]_补=0.0000$

    • 当$x=-1$时,

      $[-1]_补=2+x=10.000-1.0000=1.0000$

      (但无原码)

反码表示法

  1. 定义

    • 整数

      $[x]_反=\begin{cases} 0,x\quad 2^n>x\geq0\\ (2^{n+1}-1)+x\quad 0\geq x>-2^n(mod2^{n+1}-1)\end{cases}$

      x为真值,n为整数的位数

      如:

      • $x=+1101\quad [x]_反=0,1101$

      • $x=-1101\quad [x]_反=(2^{4+1}-1)-1101=11111-1101=1,0010$

    • 小数

      $[x]_反=\begin{cases} x\quad 1>x\geq 0 \\ (2-2^{-n})+x\quad 0\geq x>-1(mod\ 2-2^{-n})\end{cases}$

      如:

      • $x=+0.1101\quad[x]_反=0.1101$

      • $x=-0.1010\quad[x]_反=(2-2^{-4})-0.1010=1.1111-0.1010=1.0101$

  2. 举例

    • 已知$[x]_反=0,1110,求x$

      解:$x=+1110$

    • 已知$[x]_反=1,1110$,求x

      解:$x=-0001$

    特别地:

    当$x=0$时,

    设$x=+0.0000$,则$[+0.0000]_反=0.0000$

    设$x=-0.0000$,则$[-0.0000]_反=1.1111$

    同理,对于整数:$[+0]_反=0,0000$,$[-0]_反=1,1111$

    因此,$[+0]_反\neq[-0]_反$

三种机器数的小结

  • 最高位符号位,书写上用“,”(整数)或“.”(小数)将数值部分和符号位隔开。

  • 对于正数原码=补码=反码

  • 对于负数符号位为1,其数值部分

    原码除符号位外每位取反末位加1 → 补码

    原码除符号位外每位取反 → 反码

例题1:设机器字长为8位(其中1位为符号位),对于正数,当其分别代表无符号数、原码、补码和反码时,对应的真值范围各为多少?

二进制代码 无符号数的对应真值 原码 补码 反码
00000000 0 +0 $\pm0$ +0
00000001 1 +1 +1 +1
00000010 2 +2 +2 +2
$\ldots$ $\ldots$ $\ldots$ $\ldots$ $\ldots$
01111111 127 +127 +127 +127
10000000 128 -0 -128 -127
10000001 129 -1 -127 -126
$\ldots$ $\ldots$ $\ldots$ $\ldots$ $\ldots$
11111101 253 -125 -3 -2
11111110 254 -126 -2 -1
11111111 255 -127 -1 -0

例题2:已知$[y]_补$,求$[-y]_补$。

:设$[y]_补=y_0.y_1y_2\ldots y_n$

  • 若y为正数,$[y]_补=0.y_1y_2\ldots y_n$

    则$y=0.y_1y_2\ldots y_n$

    $-y=-0.y_1y_2\ldots y_n$

    得$[-y]_补=1.\overline{y_1}\overline{y_2}\ldots\overline{y_n}+2^{-n}$

    $[y]_补$连同符号位在内,每位取反,末位加1,即得$[-y]_补$。

  • 若y为负数,$[y]_补=1.y_1y_2\ldots y_n$

    则$[y]_原=1.\overline{y_1}\overline{y_2}\ldots \overline{y_n}+2^{-n}$

    $y=-(0.\overline{y_1}\overline{y_2}\ldots \overline{y_n}+2^{-n})$

    $-y=0.\overline{y_1}\overline{y_2}\ldots \overline{y_n}+2^{-n}$

    $[-y]_补=0.\overline{y_1}\overline{y_2}\ldots\overline{y_n}+2^{-n}$

    $[y]_补$连同符号位在内,每位取反,末位加1,即得$[-y]_补$。

移码表示法

补码表示很难直接判断其真值大小。

如:

十进制 二进制 补码
+21 +10101 0,10101
-21 -10101 1,01011
+31 +11111 0,11111
-31 -11111 1,00001

上述补码表示中“,”在计算机内部是不存在的,因此,从代码形式看,符号位也是一位二进制数。按这6位二进制代码比较大小的话,会得出$101011>010101$,$100001>011111$,其实恰恰相反。

如果每个真值加上一个$2^n$(n为整数的位数),则有:

$+10101+100000=110101$

$-10101+100000=001011$

$+11111+100000=111111$

$-11111+100000=000001$

  1. 定义

    $[x]_移=2^n+x(2^n>x\geq-2^n)$

    x为真值,n为整数的位数

    移码在数轴上的表示

    如:

    • $x=10100$

      $[x]_移=2^5+10100=1,10100$

    • $x=-10100$

      $[x]_移=2^5-10100=0,01100$

  2. 移码和补码的比较

    • 设 $x=+1100100$

      $[x]_移=2^7+1100100=1,1100100$

      $[x]_补=0,1100100$

    • 设 $x=-1100100$

      $[x]_移=2^7-1100100=0,0011100$

      $[x]_补=1,0011100$

    补码和移码只差一个符号位。

  3. 真值、补码和移码的对照表

    真值x(n=5) $[x]_补$ $[x]_移$ $[x]_移对应的十进制整数$
    -100000 100000 000000 0
    -11111 100001 000001 1
    -11110 100010 000010 2
    $\ldots$ $\ldots$ $\ldots$ $\ldots$
    -00001 111111 011111 31
    ±00000 000000 100000 32
    +00001 000001 100001 33
    +00010 000010 100010 34
    $\ldots$ $\ldots$ $\ldots$ $\ldots$
    +11110 011110 111110 62
    +11111 011111 111111 63
  4. 移码的特点

    • 当x=0时

      • $[+0]_移=2^5+0=1,00000$

      • $[-0]_移=2^5-0=1,00000$

      $[+0]_移=[-0]_移$

    • 当n=5时

      最小真值为$-2^5=-100000$

      $[-100000]_移=2^5-100000=000000$

      可见,最小真值的移位为全0

数的定点表示和浮点表示

定点表示

小数定点机
小数定点机
整数定点机
整数定点机
定点机 原码 补码 反码
小数定点机 $-(1-2^{-n})$~$+(1-2^{-n})$ $-1$~$+(1-2^{-n})$ $-(1-2^{-n})$~$+(1-2^{-n})$
整数定点机 $-(2^n-1)$~$+(2^n-1)$ $-2^n$~$+(2^n-1)$ $-(2^n-1)$~$+(2^n-1)$

浮点表示

  • 为什么在计算机中要引入浮点数表示?

    • 编程困难,程序员要调节小数点的位置。

    • 数的表示范围小,为了能表示两个大小相差很大的数据,需要很长的机器字长。

    • 数据存储单元的利用率往往很低。

  • 浮点表示的格式是什么?

    浮点数的一般形式:$N=S×r^j$

    S:尾数

    j:阶码

    r:尾数的基值(计算机中r2、4、8、16等)

    • 当$r=2$,

      $N=11.0101=0.110101×2^{10}=1.10101×2^1=1101.01×2^{-10}$

    计算机中,S为小数、可正可负j为整数、可正可负

  • 尾数和阶码的基值必须是2吗?基值的影响?

  • 表数范围与精度和哪些因素有关?

  • 为什么要引入规格化表示?

  • 目前浮点数表示格式的标准是什么?

浮点数的表示形式

浮点数的表示形式
浮点数的表示形式

浮点数的表示范围

  • 上溢:阶码>最大阶码

  • 下溢:阶码<最小阶码 按机器零处理

浮点数在数轴上的表示范围
浮点数在数轴上的表示范围

浮点数的规格化形式

基数不同,浮点数的规格化形式不同。

  • r=2 尾数最高位为1

  • r=4 尾数最高2位不全为0

  • r=8 尾数最高3位不全为0

浮点数的规格化

  • r=2

    • 左规 尾数左移1位,阶码减1

    • 右规 尾数右移1位,阶码加1

  • r=4

    • 左规 尾数左移2位,阶码减1

    • 右规 尾数右移2位,阶码加1

  • r=8

    • 左规 尾数左移3位,阶码减1

    • 右规 尾数右移3位,阶码加1

基数r越大,可表示的浮点数的范围越大。

基数r越大,浮点数的精度越低。

举例

IEEE 754 标准

定点运算

移位运算

移位运算的数学意义

算术移位规则

算术移位的硬件实现

算术移位与逻辑移位的区别

浮点四则运算

算术逻辑单元